#ifndef DTU_LOG_H
#define DTU_LOG_H

#include "dtu_common.h"

/* 日志输出目标 */
typedef enum {
    LOG_OUTPUT_CONSOLE = 1,    /* 控制台输出 */
    LOG_OUTPUT_FILE = 2,       /* 文件输出 */
    LOG_OUTPUT_SYSLOG = 4,     /* 系统日志 */
    LOG_OUTPUT_NETWORK = 8     /* 网络输出 */
} log_output_t;

/* 日志配置结构 */
typedef struct {
    log_level_t level;         /* 日志级别 */
    int output_mask;           /* 输出目标掩码 */
    char log_file[256];        /* 日志文件路径 */
    size_t max_file_size;      /* 最大文件大小 */
    int max_backup_files;      /* 最大备份文件数 */
    bool enable_color;         /* 启用颜色输出 */
    bool enable_timestamp;     /* 启用时间戳 */
    bool enable_thread_id;     /* 启用线程ID */
    bool enable_function_name; /* 启用函数名 */
} log_config_t;

/* 日志统计信息 */
typedef struct {
    uint32_t debug_count;      /* DEBUG日志数量 */
    uint32_t info_count;       /* INFO日志数量 */
    uint32_t warn_count;       /* WARN日志数量 */
    uint32_t error_count;      /* ERROR日志数量 */
    uint32_t fatal_count;      /* FATAL日志数量 */
    uint32_t total_count;      /* 总日志数量 */
    size_t total_size;         /* 总日志大小 */
} log_stats_t;

/* 日志管理器结构 */
typedef struct {
    log_config_t config;       /* 日志配置 */
    log_stats_t stats;         /* 统计信息 */
    FILE* log_file_fp;         /* 日志文件指针 */
    pthread_mutex_t mutex;     /* 互斥锁 */
    bool initialized;          /* 初始化标志 */
} log_manager_t;

/* 日志宏定义 */
#define DTU_LOG_DEBUG(fmt, ...) \
    dtu_log_write(LOG_LEVEL_DEBUG, __FILE__, __LINE__, __FUNCTION__, fmt, ##__VA_ARGS__)

#define DTU_LOG_INFO(fmt, ...) \
    dtu_log_write(LOG_LEVEL_INFO, __FILE__, __LINE__, __FUNCTION__, fmt, ##__VA_ARGS__)

#define DTU_LOG_WARN(fmt, ...) \
    dtu_log_write(LOG_LEVEL_WARN, __FILE__, __LINE__, __FUNCTION__, fmt, ##__VA_ARGS__)

#define DTU_LOG_ERROR(fmt, ...) \
    dtu_log_write(LOG_LEVEL_ERROR, __FILE__, __LINE__, __FUNCTION__, fmt, ##__VA_ARGS__)

#define DTU_LOG_FATAL(fmt, ...) \
    dtu_log_write(LOG_LEVEL_FATAL, __FILE__, __LINE__, __FUNCTION__, fmt, ##__VA_ARGS__)

/* 条件日志宏 */
#define DTU_LOG_DEBUG_IF(condition, fmt, ...) \
    do { if (condition) DTU_LOG_DEBUG(fmt, ##__VA_ARGS__); } while(0)

#define DTU_LOG_INFO_IF(condition, fmt, ...) \
    do { if (condition) DTU_LOG_INFO(fmt, ##__VA_ARGS__); } while(0)

#define DTU_LOG_WARN_IF(condition, fmt, ...) \
    do { if (condition) DTU_LOG_WARN(fmt, ##__VA_ARGS__); } while(0)

#define DTU_LOG_ERROR_IF(condition, fmt, ...) \
    do { if (condition) DTU_LOG_ERROR(fmt, ##__VA_ARGS__); } while(0)

/* 十六进制数据日志宏 */
#define DTU_LOG_HEX(level, data, len, fmt, ...) \
    dtu_log_hex(level, __FILE__, __LINE__, __FUNCTION__, data, len, fmt, ##__VA_ARGS__)

/* 函数声明 */

/**
 * @brief 初始化日志系统
 * @param config 日志配置，NULL使用默认配置
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_log_init(const log_config_t* config);

/**
 * @brief 销毁日志系统
 */
void dtu_log_cleanup(void);

/**
 * @brief 写入日志
 * @param level 日志级别
 * @param file 文件名
 * @param line 行号
 * @param func 函数名
 * @param fmt 格式字符串
 * @param ... 可变参数
 */
void dtu_log_write(log_level_t level, const char* file, int line, 
                   const char* func, const char* fmt, ...);

/**
 * @brief 写入十六进制数据日志
 * @param level 日志级别
 * @param file 文件名
 * @param line 行号
 * @param func 函数名
 * @param data 数据指针
 * @param len 数据长度
 * @param fmt 格式字符串
 * @param ... 可变参数
 */
void dtu_log_hex(log_level_t level, const char* file, int line, 
                 const char* func, const void* data, size_t len, 
                 const char* fmt, ...);

/**
 * @brief 设置日志级别
 * @param level 日志级别
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_log_set_level(log_level_t level);

/**
 * @brief 获取日志级别
 * @return 当前日志级别
 */
log_level_t dtu_log_get_level(void);

/**
 * @brief 设置日志输出目标
 * @param output_mask 输出目标掩码
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_log_set_output(int output_mask);

/**
 * @brief 获取日志输出目标
 * @return 输出目标掩码
 */
int dtu_log_get_output(void);

/**
 * @brief 刷新日志缓冲区
 */
void dtu_log_flush(void);

/**
 * @brief 轮转日志文件
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_log_rotate(void);

/**
 * @brief 获取日志统计信息
 * @param stats 统计信息结构指针
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_log_get_stats(log_stats_t* stats);

/**
 * @brief 重置日志统计信息
 */
void dtu_log_reset_stats(void);

/**
 * @brief 获取日志级别字符串
 * @param level 日志级别
 * @return 级别字符串
 */
const char* dtu_log_level_string(log_level_t level);

/**
 * @brief 从字符串解析日志级别
 * @param str 级别字符串
 * @return 日志级别，失败返回LOG_LEVEL_INFO
 */
log_level_t dtu_log_level_from_string(const char* str);

/**
 * @brief 检查日志级别是否启用
 * @param level 日志级别
 * @return true 启用，false 禁用
 */
bool dtu_log_is_level_enabled(log_level_t level);

#endif /* DTU_LOG_H */
